package net.siufung.boot.executor.properties;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import net.siufung.boot.executor.ExecutorConstants;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * @author 陈建峰
 * @date 2022/9/26 3:58 下午
 * @since V1.0.0
 */
@Data
@ApiModel("threadPoolExecutorProperties")
@ConfigurationProperties(prefix=ThreadPoolExecutorProperties.PREFIX)
public class ThreadPoolExecutorProperties {

    public static final String PREFIX = "boot.executor";

    /**
     * 核心线程数（默认是1）：若是IO密集型，cpu核心数*2，若是cpu密集型，cpu核心数
     * 核心线程会一直存活，及时没有任务需要执行
     * 设置allowCoreThreadTimeout=true（默认false）时，核心线程会超时关闭
     * 注意：当线程数小于核心线程数时，即使有线程空闲，线程池也会优先创建新线程处理
     */
    @ApiModelProperty(value = "线程池维护线程的最少数量")
    private Integer corePoolSize = 8;

    /**
     * 允许线程空闲时间（单位：默认为秒，默认60S）
     * 当线程空闲时间达到keepAliveTime时，线程会退出，直到线程数量=corePoolSize
     * 如果allowCoreThreadTimeout=true，则会直到线程数量=0
     */
    @ApiModelProperty(value = "允许的空闲时间")
    private Integer keepAliveSeconds = 60;

    /**
     * 最大线程数，系统默认Integer.MAX_VALUE
     */
    @ApiModelProperty(value = "线程池维护线程的最大数量")
    private Integer maxPoolSize = 20;

    /**
     * 缓冲队列大小，系统默认Integer.MAX_VALUE
     * 注意：这个值肯定要改小，不然任务陡增时，都堆在队列中（队列值大），
     * 核心线程数就那几个，无法很快执行队列中的任务，
     * 就会延长响应时间，阻塞任务
     */
    @ApiModelProperty(value = "缓存队列")
    private Integer queueCapacity = 1000;

    /**
     * 线程池名前缀，用于监控识别
     */
    @ApiModelProperty(value = "线程名称前缀")
    private String threadNamePrefix = ExecutorConstants.THREAD_POOL_TASK_EXECUTOR;

    /**
     * 是否允许线程超时
     */
    @ApiModelProperty(value = "是否允许线程超时")
    private Boolean allowCoreThreadTimeOut = true;

    /**
     * 对拒绝task的处理策略
     */
    @ApiModelProperty(value = "对拒绝task的处理策略")
    private String rejectedExecutionHandler = "callerRunsPolicy";

    /**
     * 允许核心线程超时（默认false）
     */
    private boolean allowCoreThreadTimeout = false;

    /**
     * 当任务完成后，长时间无待处理任务时，销毁线程池
     */
    private boolean waitForTasksToCompleteOnShutdown = false;
    private int awaitTerminationSeconds = 0;

    /**
     * event bus 身份标识
     */
    private String eventbusIdentifier = ExecutorConstants.DEFAULT_ASYNC_EVENTBUS;
}
